import { analysisIntent, IntentHandler } from "../core/tool/baseScene";
import { mathType } from "../core/tool/face";
import { ButtonIntentConfig } from "../core/tool/Icard";
import { staticToInstance } from './base/LegacyServiceAdapter';
import { ModernPopupService } from './ModernPopupService';

export enum closeType {
    none,
    // 收到任意一次消息关闭
    onceMsg,
}

/**
 * 弹窗服务
 * 负责处理弹窗相关的业务逻辑
 */
export class PopupService {
    
    /**
     * 创建意图处理器
     * @param mathType 匹配类型
     * @param mathStr 匹配字符串
     * @param action 动作函数
     * @param self 执行上下文
     * @param isHideMath 是否隐藏匹配
     * @returns 意图处理器
     */
    @staticToInstance(ModernPopupService)
    static createIntentHandler(
        mathType: mathType,
        mathStr: string,
        action: Function,
        self: any,
        isHideMath: boolean = false
    ): IntentHandler {
        return {
            mathType,
            mathStr,
            action,
            self,
            updateTime: Date.now(),
            isHideMath
        };
    }
    
    /**
     * 生成意图处理器键值
     * @param mathType 匹配类型
     * @param mathStr 匹配字符串
     * @returns 键值字符串
     */
    @staticToInstance(ModernPopupService)
    static generateIntentKey(mathType: mathType, mathStr: string): string {
        return `${mathType}-${mathStr}`;
    }
    
    /**
     * 排序意图处理器
     * @param handlers 意图处理器数组
     * @returns 排序后的意图处理器数组
     */
    @staticToInstance(ModernPopupService)
    static sortIntentHandlers(handlers: IntentHandler[]): IntentHandler[] {
        return handlers.sort((a, b) => {
            if (a.mathType === b.mathType) {
                return b.mathStr.length - a.mathStr.length;
            }
            return a.mathType - b.mathType;
        });
    }
    
    /**
     * 注册按钮意图
     * @param buttonConfigs 按钮配置数组
     * @param self 玩家实例
     * @param intentHandlers 意图处理器映射
     * @returns 注册结果
     */
    @staticToInstance(ModernPopupService)
    static registerButtonIntents(
        buttonConfigs: ButtonIntentConfig[],
        self: any,
        intentHandlers: Map<string, IntentHandler>
    ): boolean {
        try {
            buttonConfigs.forEach(config => {
                const key = this.generateIntentKey(config.mathType || mathType.完全匹配, config.text);
                intentHandlers.set(key, this.createIntentHandler(
                    config.mathType || mathType.完全匹配,
                    config.text,
                    (data: analysisIntent) => {
                        config.action.call(self,data);
                    },
                    self
                ));
            });
            return true;
        } catch (error) {
            console.error('注册按钮意图失败:', error);
            return false;
        }
    }
    
    /**
     * 注册全部拦截监听器
     * @param callback 回调函数
     * @param self 执行上下文
     * @param intentHandlers 意图处理器映射
     * @returns 注册结果
     */
    @staticToInstance(ModernPopupService)
    static registerFullInterceptor(
        callback: Function,
        self: any,
        intentHandlers: Map<string, IntentHandler>
    ): boolean {
        try {
            const key = this.generateIntentKey(mathType.全部拦截, '');
            intentHandlers.set(key, this.createIntentHandler(
                mathType.全部拦截,
                '',
                callback,
                self
            ));
            return true;
        } catch (error) {
            console.error('注册全部拦截监听器失败:', error);
            return false;
        }
    }
    
    /**
     * 清除所有意图处理器
     * @param intentHandlers 意图处理器映射
     */
    @staticToInstance(ModernPopupService)
    static clearIntentHandlers(intentHandlers: Map<string, IntentHandler>): void {
        intentHandlers.clear();
    }
    
    /**
     * 验证弹窗状态
     * @param isShow 是否显示
     * @param content 内容
     * @returns 验证结果
     */
    @staticToInstance(ModernPopupService)
    static validatePopupState(isShow: boolean, content: string): boolean {
        return isShow && content.trim() !== '';
    }
    
    /**
     * 获取弹窗状态信息
     * @param isShow 是否显示
     * @param content 内容
     * @param handlerCount 处理器数量
     * @returns 状态信息
     */
    @staticToInstance(ModernPopupService)
    static getPopupStatus(isShow: boolean, content: string, handlerCount: number): {
        isActive: boolean;
        hasContent: boolean;
        handlerCount: number;
        isValid: boolean;
    } {
        return {
            isActive: isShow,
            hasContent: content.trim() !== '',
            handlerCount,
            isValid: this.validatePopupState(isShow, content)
        };
    }
    
    /**
     * 格式化弹窗内容
     * @param content 原始内容
     * @returns 格式化后的内容
     */
    @staticToInstance(ModernPopupService)
    static formatPopupContent(content: string): string {
        return content.trim();
    }
    
    /**
     * 重置弹窗状态
     * @returns 重置后的状态
     */
    @staticToInstance(ModernPopupService)
    static resetPopupState(): {
        content: string;
        isShow: boolean;
        listener: Function | undefined;
    } {
        return {
            content: '',
            isShow: false,
            listener: undefined
        };
    }
} 